package com.atguigu.gmall.web.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchAttr;
import com.atguigu.gmall.model.list.SearchParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@Slf4j
public class ListController {

    //  http://list.gmall.com/list.html?category3Id=61&trademark=1:小米
    //  http://list.gmall.com/list.html?keyword=小米手机&trademark=1:小米
    //  OpenFeign 传递参数
    //  1. 具体的参数; 指定 (@PathVariable("skuId") Long skuId, @PathVariable("spuId") Long spuId)
    //  2. 传递的是对象呢; 参数是的对象的时候 应该先传递到请求体：以Json 格式存在！
    @Autowired
    private ListFeignClient listFeignClient;
    @GetMapping("list.html")
    public String list(SearchParam searchParam, Model model){
        //  远程调用： listFeignClient.search(searchParam);  feign ;  service-list;
        Result<Map> result = this.listFeignClient.list(searchParam);
        //  后台需要存储key searchParam trademarkParam{品牌面包屑}  urlParam{记录用户通过了那些条件进行检索} propsParamList{平台属性面包屑} orderMap{排序规则}
        //  urlParam{记录用户通过了那些条件进行检索}
        //  如何获取到url 参数！
        String urlParam = this.makeUrlParam(searchParam);
        //  trademarkParam 品牌面包屑： 品牌：品牌名称
        String trademarkParam = this.makeTrademarkParam(searchParam.getTrademark());
        //  propsParamList 平台属性面包屑：集合 机身内存：128G 运行内存：8G
        //  这个泛型如何确定? 根据页面显示的内容确定！
        List<SearchAttr> propsParamList = this.makePropsList(searchParam.getProps());
        //  排序规则： orderMap.type 类型 1:综合 -- hotScore 类型 2:价格  orderMap.sort asc:升序，desc:降序
        Map<String,Object> orderMap = this.makeOrderMap(searchParam.getOrder());

        //  trademarkList {品牌列表}  attrsList{平台属性集合} goodsList{商品集合}  pageNo totalPages
        model.addAttribute("searchParam",searchParam);
        model.addAttribute("urlParam",urlParam);
        model.addAttribute("trademarkParam",trademarkParam);
        model.addAttribute("propsParamList",propsParamList);
        model.addAttribute("orderMap",orderMap);
        //  trademarkList {品牌列表}  attrsList{平台属性集合} goodsList{商品集合}  pageNo totalPages 它们属于SearchResponseVo 实体类的字段！
        //  实体类与map 可以 转换! result.getData(); 获取到 SearchResponseVo 对象了！
        model.addAllAttributes(result.getData());

        //  返回列表页面.
        return "list/index";
    }

    /**
     * 设置排序规则
     * @param order
     * @return
     */
    private Map<String, Object> makeOrderMap(String order) {
        Map<String, Object> map = new HashMap<>();
        //  order=1:desc order=2:desc order=1:asc order=2:asc
        if (!StringUtils.isEmpty(order)){
            String[] split = order.split(":");
            //  判断
            if (split!=null && split.length==2){
                map.put("type",split[0]);
                map.put("sort",split[1]);
            }
        } else {
            //  默认排序
            map.put("type","1");
            map.put("sort","desc");
        }
        return map;
    }

    /**
     * 平台属性面包屑：
     * @param props
     * @return
     */
    private List<SearchAttr> makePropsList(String[] props) {
        //  声明一个集合对象：
        List<SearchAttr> searchAttrList = new ArrayList<>();
        //  判断
        if (props!=null && props.length>0){
            //  props=23:8G:运行内存&props=24:256G:机身内存
            for (String prop : props) {
                String[] split = prop.split(":");
                if (split!=null && split.length ==3){
                    //  声明一个对象
                    SearchAttr searchAttr = new SearchAttr();
                    searchAttr.setAttrId(Long.parseLong(split[0]));
                    searchAttr.setAttrValue(split[1]);
                    searchAttr.setAttrName(split[2]);
                    //  添加数据.
                    searchAttrList.add(searchAttr);
                }
            }
        }

        //  返回数据：
        return searchAttrList;
    }

    /**
     * 制作品牌面包屑
     * @param trademark
     * @return
     */
    private String makeTrademarkParam(String trademark) {
        if (!StringUtils.isEmpty(trademark)){
            //  trademark = 1:小米
            String[] split = trademark.split(":");
            if (split!=null && split.length>0){
                //  直接返回
                return "品牌:"+split[1];
            }
        }
        return null;
    }

    /**
     * 返回参数列表
     * @param searchParam
     * @return
     */
    private String makeUrlParam(SearchParam searchParam) {
        //  声明一个字符串变量
        StringBuffer stringBuffer = new StringBuffer();
        //  第一个入口：
        //  通过判断 分类Id
        //  http://list.gmall.com/list.html?category3Id=61
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())){
            stringBuffer.append("category3Id=").append(searchParam.getCategory3Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory2Id())){
            stringBuffer.append("category2Id=").append(searchParam.getCategory2Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory1Id())){
            stringBuffer.append("category1Id=").append(searchParam.getCategory1Id());
        }

        //  第二个入口关键词： http://list.gmall.com/list.html?keyword=手机
        if (!StringUtils.isEmpty(searchParam.getKeyword())){
            stringBuffer.append("keyword=").append(searchParam.getKeyword());
        }

        //  根据品牌检索： list.html?category3Id=61&trademark=1:小米;
        if (!StringUtils.isEmpty(searchParam.getTrademark())){
            if (stringBuffer.length()>0){
                stringBuffer.append("&trademark=").append(searchParam.getTrademark());
            }
        }
        // list.html?category3Id=61&trademark=1:小米&props=23:8G:运行内存&props=24:256G:机身内存;
        String[] props = searchParam.getProps();
        //  判断 props=23:8G:运行内存&props=24:256G:机身内存
        if (props!=null && props.length>0){
            for (String prop : props) {
                if (stringBuffer.length()>0){
                    stringBuffer.append("&props=").append(prop);
                }
            }
        }
        // list.html?category3Id=61
        // list.html?category3Id=61&trademark=1:小米;
        // list.html?category3Id=61&trademark=1:小米&props=23:8G:运行内存&props=24:256G:机身内存;
        return "list.html?"+stringBuffer.toString();
    }
}
